<!DOCTYPE html>
<html lang="zh-cn" dir="ltr">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Redis # 是一种高性能的Key-Value数据库
NoSQL介绍 # NoSQL：一类新出现的数据库(not only sql)，它的特点：
1.不支持SQL语法
2.存储结构跟传统关系型数据库中的那种关系表完全不同，nosql中存储的数据都是Key-Value形式
3.NoSQL的世界中没有一种通用的语言，每种nosql数据库都有自己的api和语法，以及擅长的业务场景
NoSQL和SQL数据库的比较： # 适用场景不同：sql数据库适合用于关系特别复杂的数据查询场景，nosql反之
两者在不断地取长补短，呈现融合趋势
Redis简介 # Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。从2010年3月15日起，Redis的开发工作由VMware主持。从2013年5月开始，Redis的开发由Pivotal赞助。
Redis是 NoSQL技术阵营中的一员，它通过多种键值数据类型来适应不同场景下的存储需求，借助一些高层级的接口使用其可以胜任，如缓存、队列系统的不同角色。
Redis特性 # Redis 与其他 key - value 缓存产品有以下三个特点：
Redis支持数据的持久化，可以将内存中的数据保存在磁盘中，重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据，同时还提供list列表，set集合，zset有序集合，hash等数据结构的存储。 Redis支持数据的备份，即master-slave模式的数据备份。 Redis 优势 # 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的，同时Redis还支持对几个操作全并后的原子性执行。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 Redis应用场景 # 用来做缓存(ehcache/memcached)——redis的所有数据是放在内存中的（内存数据库） 可以在某些特定应用场景下替代传统数据库——比如社交类的应用 在一些大型系统中，巧妙地实现一些特定的功能：session共享、购物车 只要你有丰富的想象力，redis可以用在可以给你无限的惊喜……. 中文官网
Redis安装（Mac） # 直接brew安装">
<meta name="theme-color" content="#FFFFFF">
<meta name="color-scheme" content="light dark"><meta property="og:title" content="Redis基础" />
<meta property="og:description" content="Redis # 是一种高性能的Key-Value数据库
NoSQL介绍 # NoSQL：一类新出现的数据库(not only sql)，它的特点：
1.不支持SQL语法
2.存储结构跟传统关系型数据库中的那种关系表完全不同，nosql中存储的数据都是Key-Value形式
3.NoSQL的世界中没有一种通用的语言，每种nosql数据库都有自己的api和语法，以及擅长的业务场景
NoSQL和SQL数据库的比较： # 适用场景不同：sql数据库适合用于关系特别复杂的数据查询场景，nosql反之
两者在不断地取长补短，呈现融合趋势
Redis简介 # Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。从2010年3月15日起，Redis的开发工作由VMware主持。从2013年5月开始，Redis的开发由Pivotal赞助。
Redis是 NoSQL技术阵营中的一员，它通过多种键值数据类型来适应不同场景下的存储需求，借助一些高层级的接口使用其可以胜任，如缓存、队列系统的不同角色。
Redis特性 # Redis 与其他 key - value 缓存产品有以下三个特点：
Redis支持数据的持久化，可以将内存中的数据保存在磁盘中，重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据，同时还提供list列表，set集合，zset有序集合，hash等数据结构的存储。 Redis支持数据的备份，即master-slave模式的数据备份。 Redis 优势 # 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的，同时Redis还支持对几个操作全并后的原子性执行。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 Redis应用场景 # 用来做缓存(ehcache/memcached)——redis的所有数据是放在内存中的（内存数据库） 可以在某些特定应用场景下替代传统数据库——比如社交类的应用 在一些大型系统中，巧妙地实现一些特定的功能：session共享、购物车 只要你有丰富的想象力，redis可以用在可以给你无限的惊喜……. 中文官网
Redis安装（Mac） # 直接brew安装" />
<meta property="og:type" content="article" />
<meta property="og:url" content="http://example.org/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/redis/2022-03-20-redis%E5%9F%BA%E7%A1%80/" /><meta property="article:section" content="docs" />
<meta property="article:published_time" content="2022-03-20T14:47:04+00:00" />
<meta property="article:modified_time" content="2022-03-20T14:47:04+00:00" />

<title>Redis基础 | Soulmate</title>
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.c58292d36b18b675680ab9baea2029204537b839ea72f258746ec0f32ce8d6c8.css" integrity="sha256-xYKS02sYtnVoCrm66iApIEU3uDnqcvJYdG7A8yzo1sg=" crossorigin="anonymous">
  <script defer src="/flexsearch.min.js"></script>
  <script defer src="/en.search.min.beb4601b1eab618a95e3b0d49ce0487f50ed4cb8eecc3a3bd5f798bdba5ad9f3.js" integrity="sha256-vrRgGx6rYYqV47DUnOBIf1DtTLjuzDo71feYvbpa2fM=" crossorigin="anonymous"></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
-->
  
</head>
<body dir="ltr">
  <input type="checkbox" class="hidden toggle" id="menu-control" />
  <input type="checkbox" class="hidden toggle" id="toc-control" />
  <main class="container flex">
    <aside class="book-menu">
      <div class="book-menu-content">
        
  <nav>
<h2 class="book-brand">
  <a class="flex align-center" href="/"><img src="/logo.png" alt="Logo" /><span>Soulmate</span>
  </a>
</h2>


<div class="book-search">
  <input type="text" id="book-search-input" placeholder="Search" aria-label="Search" maxlength="64" data-hotkeys="s/" />
  <div class="book-search-spinner hidden"></div>
  <ul id="book-search-results"></ul>
</div>












  



  
  <ul>
    
      
        <li class="book-section-flat" >
          
  
  

  
    <input type="checkbox" id="section-074eed0fb8c6f9d99dfeff898388792f" class="toggle"  />
    <label for="section-074eed0fb8c6f9d99dfeff898388792f" class="flex justify-between">
      <a role="button" class="">计算机基础</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/git%E5%9F%BA%E7%A1%80/" class="">Git基础</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/linux%E5%9F%BA%E7%A1%80/" class="">Linux基础</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80/" class="">操作系统基础</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%9F%BA%E7%A1%80/" class="">数据库基础</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/" class="">计算机网络基础</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li class="book-section-flat" >
          
  
  

  
    <span>Golang</span>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-670eda717a06f31447c52422ec93a159" class="toggle"  />
    <label for="section-670eda717a06f31447c52422ec93a159" class="flex justify-between">
      <a role="button" class="">基础</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/golang/%E5%9F%BA%E7%A1%80/2021-04-07-go%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80%E4%B8%80/" class="">2021 04 07 Go语言基础（一）</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/golang/%E5%9F%BA%E7%A1%80/2021-10-26-go%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80%E4%BA%8C/" class="">2021 10 26 Go语言基础（二）</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/golang/%E5%9F%BA%E7%A1%80/2021-12-20-benchmark%E6%B5%8B%E8%AF%95/" class="">2021 12 20 Benchmark测试</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/golang/%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84-go/" class="">数据结构 Go</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-c453881a62c640f6a4cceec99c02477e" class="toggle"  />
    <label for="section-c453881a62c640f6a4cceec99c02477e" class="flex justify-between">
      <a role="button" class="">高阶</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/golang/%E9%AB%98%E9%98%B6/go%E8%AF%AD%E8%A8%80%E9%AB%98%E9%98%B6%E4%B8%80/" class="">Go语言高阶（一）</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-ee53da12118bfd3e9b35f3e9494ab55b" class="toggle"  />
    <label for="section-ee53da12118bfd3e9b35f3e9494ab55b" class="flex justify-between">
      <a role="button" class="">LeetCode</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/golang/leetcode/2021-10-14-golang%E5%8A%9B%E6%89%A3%E5%88%B7%E9%A2%98%E4%B8%80/" class="">2021 10 14 Golang力扣刷题（一）</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/golang/leetcode/2021-10-28-leetcode%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93/" class="">2021 10 28 Leet Code算法总结</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/golang/leetcode/2021-11-04-golang%E5%8A%9B%E6%89%A3%E5%88%B7%E9%A2%98%E4%BA%8C/" class="">2021 11 04 Golang力扣刷题（二）</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/golang/leetcode/%E5%BF%85%E5%88%B7top101/" class="">必刷top101</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li class="book-section-flat" >
          
  
  

  
    <span>区块链</span>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-76bfb65f46ce25a0ff78d6cc4ad47773" class="toggle"  />
    <label for="section-76bfb65f46ce25a0ff78d6cc4ad47773" class="flex justify-between">
      <a role="button" class="">Fabric</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/2021-05-08-fabric-sdk-go%E8%AF%A6%E8%A7%A3/" class="">fabric-sdk-go详解</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-1e3df3eda5cf08a9c7e8cc723288fefb" class="toggle"  />
    <label for="section-1e3df3eda5cf08a9c7e8cc723288fefb" class="flex justify-between">
      <a role="button" class="">环境测试</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95/2021-03-18-centos%E5%AE%89%E8%A3%85fabric1.2/" class="">centos安装fabric1.2</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95/2021-03-22-fabric%E7%BD%91%E7%BB%9C%E4%B8%AD%E7%9A%84%E6%8A%A5%E9%94%99%E4%BA%8C/" class="">2021 03 22 Fabric网络中的报错（二）</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95/2021-03-24-fabric%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/" class="">2021 03 24 Fabric环境搭建</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95/2021-03-25-fabric-solo%E8%8A%82%E7%82%B9%E6%B5%8B%E8%AF%95/" class="">2021 03 25 Fabric Solo节点测试</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95/2021-03-25-fabric%E5%A4%9A%E6%9C%BA%E6%90%AD%E5%BB%BA/" class="">2021 03 25 Fabric多机搭建</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95/2021-05-01-%E6%89%8B%E5%8A%A8%E7%94%9F%E6%88%90ca%E8%AF%81%E4%B9%A6%E6%90%AD%E5%BB%BAfabric%E7%BD%91%E7%BB%9C/" class="">2021 05 01 手动生成ca证书搭建fabric网络</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95/2021-12-20-%E9%83%A8%E7%BD%B2tape%E6%B5%8B%E8%AF%95/" class="">2021 12 20 部署tape测试</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95/fabric%E7%BD%91%E7%BB%9C%E4%B8%AD%E7%9A%84%E6%8A%A5%E9%94%99%E4%B8%80/" class="">Fabric网络中的报错（一）</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-25aef1d59a561fcefcaecb043ef8afd2" class="toggle"  />
    <label for="section-25aef1d59a561fcefcaecb043ef8afd2" class="flex justify-between">
      <a role="button" class="">配置文件</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/2021-03-29-configtx-yaml%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/" class="">2021 03 29 Configtx Yaml文件详解</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/2021-03-29-crypto-config-yaml%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/" class="">2021 03 29 Crypto Config Yaml文件详解</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/2021-03-30-config-yaml%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/" class="">2021 03 30 Config Yaml文件详解</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/2021-03-30-docker-compose-yaml%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/" class="">2021 03 30 Docker Compose Yaml文件详解</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/2021-05-01-cryptogen%E7%94%9F%E6%88%90%E7%9A%84%E8%AF%81%E4%B9%A6%E8%AF%A6%E8%A7%A3/" class="">2021 05 01 Cryptogen生成的证书详解</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/2022-04-14-%E5%8D%87%E7%BA%A7%E9%93%BE%E7%A0%81/" class="">升级链码</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/2021-04-15-fabric-ca%E8%AF%A6%E8%A7%A3/" class="">2021 04 15 Fabric Ca详解</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/2021-04-15-fabric1.4%E5%A4%9A%E9%80%9A%E9%81%93%E5%AE%9E%E9%AA%8C/" class="">2021 04 15 Fabric1.4多通道实验</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/2021-04-17-%E5%A6%82%E4%BD%95%E5%9C%A8%E5%B7%B2%E6%9C%89%E7%BB%84%E7%BB%87%E4%B8%AD%E5%A2%9E%E5%8A%A0%E8%8A%82%E7%82%B9/" class="">2021 04 17 如何在已有组织中增加节点</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/2021-05-02-fabric%E6%B5%8F%E8%A7%88%E5%99%A8%E6%90%AD%E5%BB%BA/" class="">2021 05 02 Fabric浏览器搭建</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/2021-05-10-%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6/" class="">2021 05 10 智能合约</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/2022-02-25-fabric%E7%9B%B8%E5%85%B3%E6%9C%BA%E5%88%B6%E4%B8%8E%E5%8E%9F%E7%90%86/" class="">2022 02 25 Fabric相关机制与原理</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/fabric/2022-03-25-%E5%8C%BA%E5%9D%97%E9%93%BE%E7%BD%91%E7%BB%9C%E6%B7%BB%E5%8A%A0%E7%BB%84%E7%BB%87/" class="">2022 03 25 区块链网络添加组织</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-b07621083aa30b12de4c0333941e479f" class="toggle"  />
    <label for="section-b07621083aa30b12de4c0333941e479f" class="flex justify-between">
      <a role="button" class="">比特币</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/%E6%AF%94%E7%89%B9%E5%B8%81/2022-02-25-%E6%AF%94%E7%89%B9%E5%B8%81%E7%9B%B8%E5%85%B3%E6%9C%BA%E5%88%B6%E4%B8%8E%E5%8E%9F%E7%90%86/" class="">2022 02 25 比特币相关机制与原理</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-ff5477999ef29208270c84e8b56b2758" class="toggle"  />
    <label for="section-ff5477999ef29208270c84e8b56b2758" class="flex justify-between">
      <a role="button" class="">IPFS</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/ipfs/2021-06-02-ipfs%E7%A7%81%E6%9C%89%E7%BD%91%E7%BB%9C%E6%90%AD%E5%BB%BA/" class="">2021 06 02 IP Fs私有网络搭建</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/ipfs/2021-07-08-ipfs%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86%E4%B8%80/" class="">2021 07 08 IP Fs基本原理（一）</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/ipfs/2021-07-12-ipfs-webui%E5%8F%AF%E8%A7%86%E5%8C%96%E5%B7%A5%E5%85%B7%E6%90%AD%E5%BB%BA/" class="">2021 07 12 Ipfs Webui可视化工具搭建</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/ipfs/2021-12-05-go-ipfs-api/" class="">2021 12 05 Go Ipfs API</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-77a0a17b06e8d04cfb0fba9952941706" class="toggle"  />
    <label for="section-77a0a17b06e8d04cfb0fba9952941706" class="flex justify-between">
      <a role="button" class="">密码学</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/%E5%AF%86%E7%A0%81%E5%AD%A6/2021-03-04-%E5%AF%86%E7%A0%81%E5%AD%A6%E5%9F%BA%E7%A1%80/" class="">2021 03 04 密码学基础</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/%E5%AF%86%E7%A0%81%E5%AD%A6/2021-04-12-%E6%A4%AD%E5%9C%86%E6%9B%B2%E7%BA%BF%E5%8A%A0%E5%AF%86/" class="">2021 04 12 椭圆曲线加密</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/%E5%AF%86%E7%A0%81%E5%AD%A6/2022-08-15-%E5%8C%BA%E5%9D%97%E9%93%BE%E5%AE%89%E5%85%A8%E5%9F%BA%E7%A1%80/" class="">2022 08 15 区块链安全基础</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-2e4d10b323fd668021dbd532575d8790" class="toggle"  />
    <label for="section-2e4d10b323fd668021dbd532575d8790" class="flex justify-between">
      <a role="button" class="">Docker</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/docker/2021-04-30-docker%E5%B8%B8%E7%94%A8%E7%9F%A5%E8%AF%86%E6%80%BB%E7%BB%93/" class="">2021 04 30 Docker常用知识总结</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/docker/docker%E5%9F%BA%E7%A1%80/" class="">Docker基础</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-70383d7f28a7ae4bf840a844eb61aa16" class="toggle"  />
    <label for="section-70383d7f28a7ae4bf840a844eb61aa16" class="flex justify-between">
      <a role="button" class="">共识算法</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/%E5%85%B1%E8%AF%86%E7%AE%97%E6%B3%95/2022-03-26-raft%E5%85%B1%E8%AF%86%E7%AE%97%E6%B3%95/" class="">2022 03 26 Raft共识算法</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E5%8C%BA%E5%9D%97%E9%93%BE/%E5%85%B1%E8%AF%86%E7%AE%97%E6%B3%95/%E5%85%B1%E8%AF%86%E7%AE%97%E6%B3%95%E5%9F%BA%E7%A1%80/" class="">共识算法基础</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li class="book-section-flat" >
          
  
  

  
    <span>数据库</span>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-94f26238d1ca3b5bcd40eadc7a88d726" class="toggle"  />
    <label for="section-94f26238d1ca3b5bcd40eadc7a88d726" class="flex justify-between">
      <a role="button" class="">MySql</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/mysql/2021-04-20-mysql%E5%9F%BA%E7%A1%80%E6%80%BB%E7%BB%93/" class="">MySql基础总结</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/mysql/mac%E8%BF%9E%E6%8E%A5%E6%95%B0%E6%8D%AE%E5%BA%93%E6%89%80%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/" class="">Mac连接数据库所遇到的问题</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <input type="checkbox" id="section-01e4ef5e6295826a1eab8f1a7114ec2c" class="toggle" checked />
    <label for="section-01e4ef5e6295826a1eab8f1a7114ec2c" class="flex justify-between">
      <a role="button" class="">Redis</a>
    </label>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/redis/2022-03-21-redis%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/" class="">Redis集群搭建</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/redis/2022-03-20-redis%E5%9F%BA%E7%A1%80/" class="active">Redis基础</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="/docs/%E6%95%B0%E6%8D%AE%E5%BA%93/redis/2021-05-02-redis%E9%9D%A2%E8%AF%95%E6%80%BB%E7%BB%93/" class="">redis面试总结</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li class="book-section-flat" >
          
  
  

  
    <input type="checkbox" id="section-5f7b667081fbae0581cd216f66d5102f" class="toggle"  />
    <label for="section-5f7b667081fbae0581cd216f66d5102f" class="flex justify-between">
      <a role="button" class="">博客</a>
    </label>
  

          
  <ul>
    
  </ul>

        </li>
      
    
  </ul>











  
<ul>
  
  <li>
    <a href="https://gitee.com/chaincode" target="_blank" rel="noopener">
        Gitee
      </a>
  </li>
  
</ul>






</nav>




  <script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script>


 
      </div>
    </aside>

    <div class="book-page">
      <header class="book-header">
        
  <div class="flex align-center justify-between">
  <label for="menu-control">
    <img src="/svg/menu.svg" class="book-icon" alt="Menu" />
  </label>

  <strong>Redis基础</strong>

  <label for="toc-control">
    
    <img src="/svg/toc.svg" class="book-icon" alt="Table of Contents" />
    
  </label>
</div>


  
  <aside class="hidden clearfix">
    
  
<nav id="TableOfContents">
  <ul>
    <li><a href="#redis">Redis</a>
      <ul>
        <li>
          <ul>
            <li><a href="#nosql介绍">NoSQL介绍</a></li>
            <li><a href="#redis简介">Redis简介</a></li>
            <li><a href="#redis安装mac">Redis安装（Mac）</a></li>
            <li><a href="#服务器端和客户端命令">服务器端和客户端命令</a></li>
            <li><a href="#数据库的操作">数据库的操作</a></li>
            <li><a href="#go语言交互">go语言交互</a></li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</nav>



  </aside>
  
 
      </header>

      
      
  <article class="markdown"><h1 id="redis">
  Redis
  <a class="anchor" href="#redis">#</a>
</h1>
<p>是一种高性能的Key-Value数据库</p>
<p><img src="https://blockchaincode.oss-cn-hangzhou.aliyuncs.com/202209031414000.png" alt="" /></p>
<h3 id="nosql介绍">
  NoSQL介绍
  <a class="anchor" href="#nosql%e4%bb%8b%e7%bb%8d">#</a>
</h3>
<p>NoSQL：一类新出现的数据库(not only sql)，它的特点：</p>
<p>1.不支持SQL语法</p>
<p>2.存储结构跟传统关系型数据库中的那种关系表完全不同，nosql中存储的数据都是Key-Value形式</p>
<p>3.NoSQL的世界中没有一种通用的语言，每种nosql数据库都有自己的api和语法，以及擅长的业务场景</p>
<h4 id="nosql和sql数据库的比较">
  NoSQL和SQL数据库的比较：
  <a class="anchor" href="#nosql%e5%92%8csql%e6%95%b0%e6%8d%ae%e5%ba%93%e7%9a%84%e6%af%94%e8%be%83">#</a>
</h4>
<ul>
<li>
<p>适用场景不同：sql数据库适合用于关系特别复杂的数据查询场景，nosql反之</p>
</li>
<li>
<p>两者在不断地取长补短，呈现融合趋势</p>
</li>
</ul>
<h3 id="redis简介">
  Redis简介
  <a class="anchor" href="#redis%e7%ae%80%e4%bb%8b">#</a>
</h3>
<ul>
<li>
<p>Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。从2010年3月15日起，Redis的开发工作由VMware主持。从2013年5月开始，Redis的开发由Pivotal赞助。</p>
</li>
<li>
<p>Redis是 NoSQL技术阵营中的一员，它通过多种键值数据类型来适应不同场景下的存储需求，借助一些高层级的接口使用其可以胜任，如缓存、队列系统的不同角色。</p>
</li>
</ul>
<h4 id="redis特性">
  Redis特性
  <a class="anchor" href="#redis%e7%89%b9%e6%80%a7">#</a>
</h4>
<p>Redis 与其他 key - value 缓存产品有以下三个特点：</p>
<ul>
<li><font color='red'>Redis支持数据的持久化，可以将内存中的数据保存在磁盘中，重启的时候可以再次加载进行使用。</font></li>
<li><font color='red'>Redis不仅仅支持简单的key-value类型的数据，同时还提供list列表，set集合，zset有序集合，hash等数据结构的存储。</font></li>
<li><font color='red'>Redis支持数据的备份，即master-slave模式的数据备份。</font></li>
</ul>
<h4 id="redis-优势">
  <strong>Redis</strong> <strong>优势</strong>
  <a class="anchor" href="#redis-%e4%bc%98%e5%8a%bf">#</a>
</h4>
<ul>
<li><font color='blue'>性能极高</font> – Redis能读的速度是110000次/s,写的速度是81000次/s 。</li>
<li><font color='blue'>丰富的数据类型</font> – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。</li>
<li><font color='blue'>原子</font> – Redis的所有操作都是原子性的，同时Redis还支持对几个操作全并后的原子性执行。</li>
<li><font color='blue'>丰富的特性</font> – Redis还支持 publish/subscribe, 通知, key 过期等等特性。</li>
</ul>
<h4 id="redis应用场景">
  Redis应用场景
  <a class="anchor" href="#redis%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af">#</a>
</h4>
<ul>
<li>用来做缓存(ehcache/memcached)——redis的所有数据是放在内存中的（内存数据库）</li>
<li>可以在某些特定应用场景下替代传统数据库——比如社交类的应用</li>
<li>在一些大型系统中，巧妙地实现一些特定的功能：session共享、购物车</li>
<li>只要你有丰富的想象力，redis可以用在可以给你无限的惊喜…….</li>
</ul>
<p><a href="http://www.redis.cn">中文官网</a></p>
<h3 id="redis安装mac">
  Redis安装（Mac）
  <a class="anchor" href="#redis%e5%ae%89%e8%a3%85mac">#</a>
</h3>
<p>直接brew安装</p>
<pre tabindex="0"><code>brew install redis
</code></pre><blockquote>
<p>报错：</p>
<p>Error: No similarly named formulae found.</p>
<p>Error: No available formula or cask with the name &ldquo;<a href="mailto:redis@6.0.6">redis@6.0.6</a>&rdquo;.</p>
<p>解决办法：</p>
<p>rm -fr $(brew &ndash;repo homebrew/core)</p>
</blockquote>
<h4 id="启动">
  启动
  <a class="anchor" href="#%e5%90%af%e5%8a%a8">#</a>
</h4>
<pre tabindex="0"><code>brew services start redis
</code></pre><h4 id="重启">
  重启
  <a class="anchor" href="#%e9%87%8d%e5%90%af">#</a>
</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>brew services restart redis
</span></span></code></pre></div><h4 id="停止">
  停止
  <a class="anchor" href="#%e5%81%9c%e6%ad%a2">#</a>
</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>brew services stop redis
</span></span></code></pre></div><ul>
<li>redis-server               redis服务器</li>
<li>redis-cli                       redis命令行客户端</li>
<li>redis-benchmark       redis性能测试工具</li>
<li>redis-check-aof          AOF文件修复工具</li>
<li>redis-check-rdb          RDB文件检索工具</li>
</ul>
<h4 id="验证是否启动">
  验证是否启动
  <a class="anchor" href="#%e9%aa%8c%e8%af%81%e6%98%af%e5%90%a6%e5%90%af%e5%8a%a8">#</a>
</h4>
<pre tabindex="0"><code>redis-cli ping
</code></pre><pre tabindex="0"><code>显示：PONG
</code></pre><h4 id="关闭redis服务">
  关闭redis服务
  <a class="anchor" href="#%e5%85%b3%e9%97%adredis%e6%9c%8d%e5%8a%a1">#</a>
</h4>
<pre tabindex="0"><code>redis-cli shutdown
</code></pre><h4 id="配置">
  配置
  <a class="anchor" href="#%e9%85%8d%e7%bd%ae">#</a>
</h4>
<p>Redis的配置信息在/usr/local/etc/redis.conf下。（Mac）</p>
<p>查看</p>
<pre tabindex="0"><code>sudo vi /usr/local/etc/redis.conf
</code></pre><p><strong>核心配置选项</strong></p>
<ul>
<li>绑定ip：如果需要远程访问，可将此⾏注释，或绑定⼀个真实ip</li>
</ul>
<pre tabindex="0"><code>bind 127.0.0.1
</code></pre><ul>
<li>端⼝，默认为6379</li>
</ul>
<pre tabindex="0"><code>port 6379
</code></pre><ul>
<li>是否以守护进程运⾏
<ul>
<li>如果以守护进程运⾏，则不会在命令⾏阻塞，类似于服务</li>
<li>如果以⾮守护进程运⾏，则当前终端被阻塞</li>
<li>设置为yes表示守护进程，设置为no表示⾮守护进程</li>
<li>推荐设置为yes</li>
</ul>
</li>
</ul>
<pre tabindex="0"><code>daemonize yes
</code></pre><ul>
<li>数据⽂件</li>
</ul>
<pre tabindex="0"><code>dbfilename dump.rdb
</code></pre><ul>
<li>数据⽂件存储路径</li>
</ul>
<pre tabindex="0"><code>dir /usr/local/var/db/redis/
</code></pre><ul>
<li>⽇志⽂件</li>
</ul>
<pre tabindex="0"><code>logfile &#34;&#34;       // /usr/local/var/redis/redis-server.log
</code></pre><ul>
<li>数据库，默认有16个</li>
</ul>
<pre tabindex="0"><code>database 16
</code></pre><ul>
<li>主从复制，类似于双机备份。</li>
</ul>
<pre tabindex="0"><code>slaveof
</code></pre><h3 id="服务器端和客户端命令">
  服务器端和客户端命令
  <a class="anchor" href="#%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%af%e5%92%8c%e5%ae%a2%e6%88%b7%e7%ab%af%e5%91%bd%e4%bb%a4">#</a>
</h3>
<h4 id="服务器端">
  <strong>服务器端</strong>
  <a class="anchor" href="#%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%ab%af">#</a>
</h4>
<ul>
<li>
<p>服务器端的命令为redis-server</p>
</li>
<li>
<p>可以使⽤help查看帮助⽂档</p>
</li>
</ul>
<pre tabindex="0"><code>redis-server --help
</code></pre><ul>
<li>推荐使⽤服务的⽅式管理redis服务</li>
</ul>
<h4 id="启动-1">
  启动
  <a class="anchor" href="#%e5%90%af%e5%8a%a8-1">#</a>
</h4>
<pre tabindex="0"><code>brew services start redis  // sudo service redis start 
</code></pre><h4 id="重启-1">
  重启
  <a class="anchor" href="#%e9%87%8d%e5%90%af-1">#</a>
</h4>
<pre tabindex="0"><code>brew services restart redis  //sudo service redis stop  
</code></pre><h4 id="停止-1">
  停止
  <a class="anchor" href="#%e5%81%9c%e6%ad%a2-1">#</a>
</h4>
<pre tabindex="0"><code>brew services stop redis   //sudo service redis restart
</code></pre><h4 id="个人习惯">
  个人习惯
  <a class="anchor" href="#%e4%b8%aa%e4%ba%ba%e4%b9%a0%e6%83%af">#</a>
</h4>
<pre tabindex="0"><code>ps -aux|grep redis 查看redis服务器进程
sudo kill -9 pid 杀死redis服务器
sudo redis-server /usr/local/etc/redis.conf 指定加载的配置文件
</code></pre><h4 id="客户端">
  <strong>客户端</strong>
  <a class="anchor" href="#%e5%ae%a2%e6%88%b7%e7%ab%af">#</a>
</h4>
<pre tabindex="0"><code>客户端的命令为
redis-cli
</code></pre><p>可以使⽤help查看帮助⽂档</p>
<pre tabindex="0"><code>redis-cli --help
</code></pre><h4 id="连接redis">
  连接redis
  <a class="anchor" href="#%e8%bf%9e%e6%8e%a5redis">#</a>
</h4>
<pre tabindex="0"><code>redis-cli
</code></pre><h4 id="切换数据库">
  切换数据库
  <a class="anchor" href="#%e5%88%87%e6%8d%a2%e6%95%b0%e6%8d%ae%e5%ba%93">#</a>
</h4>
<p>数据库没有名称，默认有16个，通过0-15来标识，连接redis默认选择第一个数据库</p>
<pre tabindex="0"><code>select n
</code></pre><p><img src="https://blockchaincode.oss-cn-hangzhou.aliyuncs.com/Hexo_img/202208211313976.png" alt="" /></p>
<h3 id="数据库的操作">
  数据库的操作
  <a class="anchor" href="#%e6%95%b0%e6%8d%ae%e5%ba%93%e7%9a%84%e6%93%8d%e4%bd%9c">#</a>
</h3>
<p><strong>数据库结构</strong></p>
<ul>
<li>
<p>redis是key-value的数据结构，每条数据都是⼀个键值对</p>
</li>
<li>
<p>键的类型是字符串</p>
</li>
<li>
<p>注意：键不能重复</p>
</li>
<li>
<p>值的类型分为五种：</p>
<ul>
<li>字符串string</li>
<li>哈希hash</li>
<li>列表list</li>
<li>集合set</li>
<li>有序集合zset</li>
</ul>
</li>
</ul>
<p><strong>数据库操作行为</strong></p>
<ul>
<li>保存</li>
<li>修改</li>
<li>获取</li>
<li>删除</li>
</ul>
<p>点击中⽂官⽹查看<a href="http://redis.cn/commands.html">命令⽂档</a></p>
<h4 id="string类型">
  string类型
  <a class="anchor" href="#string%e7%b1%bb%e5%9e%8b">#</a>
</h4>
<p>字符串类型是Redis中最为基础的数据存储类型，该类型可以接受任何格式的数据，如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。</p>
<h5 id="保存">
  <strong>保存</strong>
  <a class="anchor" href="#%e4%bf%9d%e5%ad%98">#</a>
</h5>
<p>如果设置的键不存在则为添加，如果设置的键已经存在则修改</p>
<p><font color='red'>设置键值</font></p>
<pre tabindex="0"><code>set key value
</code></pre><p>例1：设置键为name值为itcast的数据</p>
<pre tabindex="0"><code>set name itcast
</code></pre><p><font color='red'>设置键值及过期时间，以秒为单位</font></p>
<pre tabindex="0"><code>setex key seconds value
</code></pre><p>例2：设置键为aa值为aa过期时间为3秒的数据</p>
<pre tabindex="0"><code>setex aa 3 aa
</code></pre><p><font color='red'>设置多个键值</font></p>
<pre tabindex="0"><code>mset key1 value1 key2 value2 ...
</code></pre><p>例3：设置键为&rsquo;a1&rsquo;值为&rsquo;go&rsquo;、键为&rsquo;a2&rsquo;值为&rsquo;c++&rsquo;、键为&rsquo;a3&rsquo;值为&rsquo;c'</p>
<pre tabindex="0"><code>mset a1 go a2 c++ a3 c
</code></pre><p><font color='red'>追加值</font></p>
<pre tabindex="0"><code>append key value
</code></pre><p>例4：向键为a1中追加值&rsquo; 真棒'</p>
<pre tabindex="0"><code>append &#39;a1&#39; &#39;真棒&#39;    //不用加‘’
</code></pre><p><strong>中文乱码问题的解决</strong></p>
<ul>
<li>退出redis客户端</li>
</ul>
<pre tabindex="0"><code>Exit
</code></pre><ul>
<li>再次进入redis客户端</li>
</ul>
<pre tabindex="0"><code>redis-cli --raw
</code></pre><h5 id="获取">
  <strong>获取</strong>
  <a class="anchor" href="#%e8%8e%b7%e5%8f%96">#</a>
</h5>
<p><font color='red'>获取：根据键获取值，如果不存在此键则返回nil</font></p>
<pre tabindex="0"><code>get key
</code></pre><p>例5：获取键&rsquo;name&rsquo;的值</p>
<pre tabindex="0"><code>get &#39;name&#39;
</code></pre><p><font color='red'>根据多个键获取多个值</font></p>
<pre tabindex="0"><code>mget key1 key2 ...
</code></pre><p>例6：获取键a1、a2、a3&rsquo;的值</p>
<pre tabindex="0"><code>mget a1 a2 a3
</code></pre><h5 id="删除">
  <strong>删除</strong>
  <a class="anchor" href="#%e5%88%a0%e9%99%a4">#</a>
</h5>
<p>详⻅下节键的操作，删除键时会将值删除</p>
<h4 id="键命令">
  键命令
  <a class="anchor" href="#%e9%94%ae%e5%91%bd%e4%bb%a4">#</a>
</h4>
<p><font color='red'>查找键，参数⽀持正则表达式</font></p>
<pre tabindex="0"><code>keys pattern
</code></pre><p>例1：查看所有键</p>
<pre tabindex="0"><code>keys * 
</code></pre><p>例2：查看名称中包含a的键</p>
<pre tabindex="0"><code>keys &#39;a*&#39;     //不用加‘’
</code></pre><p><font color='red'>判断键是否存在，如果存在返回1，不存在返回0</font></p>
<pre tabindex="0"><code>exists key1
</code></pre><p>例3：判断键a1是否存在</p>
<pre tabindex="0"><code>exists a1
</code></pre><p><font color='red'>查看键对应的value的类型</font></p>
<pre tabindex="0"><code>type key
</code></pre><p>例4：查看键a1的值类型，为redis⽀持的五种类型中的⼀种</p>
<p>type a1</p>
<p><font color='red'>删除键及对应的值</font></p>
<pre tabindex="0"><code>del key1 key2 ...
</code></pre><p>例5：删除键a2、a3</p>
<pre tabindex="0"><code>del a2 a3
</code></pre><p><font color='red'>删除库跑路</font></p>
<pre tabindex="0"><code>flushall  清空整个Redis服务器的数据
flushdb   清空当前库中所有的key
</code></pre><p><font color='red'>设置过期时间，以秒为单位</font></p>
<p>如果没有指定过期时间则⼀直存在，直到使⽤DEL移除</p>
<pre tabindex="0"><code>expire key seconds
</code></pre><p>例6：设置键&rsquo;a1&rsquo;的过期时间为3秒</p>
<pre tabindex="0"><code>expire &#39;a1&#39; 3
</code></pre><p><font color='red'>查看有效时间，以秒为单位</font></p>
<pre tabindex="0"><code>ttl key
</code></pre><p>例7：查看键&rsquo;bb&rsquo;的有效时间</p>
<pre tabindex="0"><code>ttl bb
</code></pre><h4 id="hash类型">
  hash类型
  <a class="anchor" href="#hash%e7%b1%bb%e5%9e%8b">#</a>
</h4>
<ul>
<li>
<p>hash⽤于存储对象，对象的结构为<font color='red'>属性、值</font></p>
</li>
<li>
<p>值的类型为string</p>
</li>
</ul>
<p><img src="https://blockchaincode.oss-cn-hangzhou.aliyuncs.com/Hexo_img/202208211432504.png" alt="" /></p>
<h5 id="增加修改">
  <strong>增加、修改</strong>
  <a class="anchor" href="#%e5%a2%9e%e5%8a%a0%e4%bf%ae%e6%94%b9">#</a>
</h5>
<p><font color='red'>设置单个属性</font></p>
<pre tabindex="0"><code>hset key field value
</code></pre><p>例1：设置键 user的属性name为itheima</p>
<pre tabindex="0"><code>hset user name itheima
</code></pre><p><font color='red'>设置多个属性</font></p>
<pre tabindex="0"><code>hmset key field1 value1 field2 value2 ...
</code></pre><p>例2：设置键u2的属性name为itcast、属性age为11</p>
<pre tabindex="0"><code>hmset u2 name itcast age 11
</code></pre><h5 id="获取-1">
  <strong>获取</strong>
  <a class="anchor" href="#%e8%8e%b7%e5%8f%96-1">#</a>
</h5>
<p><font color='red'>获取指定键所有的属性</font></p>
<pre tabindex="0"><code>hkeys key
</code></pre><p>例3：获取键u2的所有属性</p>
<pre tabindex="0"><code>hkeys u2
</code></pre><p><font color='red'>获取⼀个属性的值</font></p>
<pre tabindex="0"><code>hget key field
</code></pre><p>例4：获取键u2属性&rsquo;name&rsquo;的值</p>
<pre tabindex="0"><code>hget u2 &#39;name&#39;
</code></pre><p><font color='red'>获取多个属性的值</font></p>
<pre tabindex="0"><code>hmget key field1 field2 ...
</code></pre><p>例5：获取键u2属性&rsquo;name&rsquo;、&lsquo;age的值</p>
<pre tabindex="0"><code>hmget u2 name age
</code></pre><p><font color='red'>获取所有属性的值</font></p>
<pre tabindex="0"><code>hvals key
</code></pre><p>例6：获取键&rsquo;u2&rsquo;所有属性的值</p>
<pre tabindex="0"><code>hvals u2
</code></pre><p><font color='red'>获取一个hash有多少个属性</font></p>
<pre tabindex="0"><code>hlen key
</code></pre><p>例7：获取键&rsquo;u2&rsquo;有多少个属性</p>
<pre tabindex="0"><code>Hlen u2
</code></pre><h5 id="删除-1">
  <strong>删除</strong>
  <a class="anchor" href="#%e5%88%a0%e9%99%a4-1">#</a>
</h5>
<ul>
<li>
<p>删除整个hash键及值，使⽤del命令</p>
</li>
<li>
<p>删除属性，属性对应的值会被⼀起删除</p>
</li>
</ul>
<pre tabindex="0"><code>del key
</code></pre><pre tabindex="0"><code>hdel key field1 field2 ...
</code></pre><p>例7：删除键&rsquo;u2&rsquo;的属性&rsquo;age&rsquo;</p>
<pre tabindex="0"><code>hdel u2 age
</code></pre><h4 id="list类型">
  list类型
  <a class="anchor" href="#list%e7%b1%bb%e5%9e%8b">#</a>
</h4>
<ul>
<li>
<p>列表的元素类型为string</p>
</li>
<li>
<p>按照插⼊顺序排序</p>
</li>
</ul>
<h5 id="增加">
  <strong>增加</strong>
  <a class="anchor" href="#%e5%a2%9e%e5%8a%a0">#</a>
</h5>
<p><font color='red'>在左侧插⼊数据</font></p>
<pre tabindex="0"><code>lpush key value1 value2 ...
</code></pre><p>例1：从键为&rsquo;a1&rsquo;的列表左侧加⼊数据a 、 b 、c</p>
<pre tabindex="0"><code>lpush a1 a b c
</code></pre><p><img src="https://blockchaincode.oss-cn-hangzhou.aliyuncs.com/Hexo_img/202208211446491.png" alt="" /></p>
<p><font color='red'>在右侧插⼊数据</font></p>
<pre tabindex="0"><code>rpush key value1 value2 ...
</code></pre><p>例2：从键为&rsquo;a1&rsquo;的列表右侧加⼊数据0 1</p>
<pre tabindex="0"><code>rpush a1 0 1
</code></pre><p><img src="https://blockchaincode.oss-cn-hangzhou.aliyuncs.com/Hexo_img/202208211445085.png" alt="" /></p>
<p><font color='red'>在指定元素的前或后插⼊新元素</font></p>
<pre tabindex="0"><code>linsert key before或after 现有元素 新元素
</code></pre><p>·    例3：在键为&rsquo;a1&rsquo;的列表中元素&rsquo;b&rsquo;前加⼊'3'</p>
<pre tabindex="0"><code>linsert a1 before b 3
</code></pre><h5 id="获取-2">
  <strong>获取</strong>
  <a class="anchor" href="#%e8%8e%b7%e5%8f%96-2">#</a>
</h5>
<p><font color='red'>返回列表⾥指定范围内的元素</font></p>
<ul>
<li>
<p>start、stop为元素的下标索引</p>
</li>
<li>
<p>索引从左侧开始，第⼀个元素为0</p>
</li>
<li>
<p>索引可以是负数，表示从尾部开始计数，如-1表示最后⼀个元素</p>
</li>
</ul>
<pre tabindex="0"><code>lrange key start stop
</code></pre><p>例4：获取键为&rsquo;a1&rsquo;的列表所有元素</p>
<pre tabindex="0"><code>lrange a1 0 -1
</code></pre><h5 id="设置指定索引位置的元素值">
  <strong>设置指定索引位置的元素值</strong>
  <a class="anchor" href="#%e8%ae%be%e7%bd%ae%e6%8c%87%e5%ae%9a%e7%b4%a2%e5%bc%95%e4%bd%8d%e7%bd%ae%e7%9a%84%e5%85%83%e7%b4%a0%e5%80%bc">#</a>
</h5>
<p>索引从左侧开始，第⼀个元素为0</p>
<p>索引可以是负数，表示尾部开始计数，如-1表示最后⼀个元素</p>
<pre tabindex="0"><code>lset key index value
</code></pre><p>例5：修改键为&rsquo;a1&rsquo;的列表中下标为1的元素值为&rsquo;z'</p>
<pre tabindex="0"><code>lset a1 1 z
</code></pre><h5 id="删除-2">
  <strong>删除</strong>
  <a class="anchor" href="#%e5%88%a0%e9%99%a4-2">#</a>
</h5>
<p><font color='red'>删除指定元素</font></p>
<ul>
<li>
<p>将列表中前count次出现的值为value的元素移除</p>
</li>
<li>
<p>count &gt; 0: 从头往尾移除</p>
</li>
<li>
<p>count &lt; 0: 从尾往头移除</p>
</li>
<li>
<p>count = 0: 移除所有</p>
</li>
</ul>
<pre tabindex="0"><code>lrem key count value
</code></pre><p>例6.1：向列表&rsquo;a2&rsquo;中加⼊元素&rsquo;a&rsquo;、&lsquo;b&rsquo;、&lsquo;a&rsquo;、&lsquo;b&rsquo;、&lsquo;a&rsquo;、&lsquo;b&rsquo;</p>
<pre tabindex="0"><code>lpush a2 a b a b a b
</code></pre><p>例6.2：从&rsquo;a2&rsquo;列表右侧开始删除2个&rsquo;b&rsquo;</p>
<pre tabindex="0"><code>lrem a2 -2 b   
</code></pre><pre tabindex="0"><code>显示
a b a a
</code></pre><p>例6.3：查看列表&rsquo;py12&rsquo;的所有元素</p>
<pre tabindex="0"><code>lrange a2 0 -1
</code></pre><h4 id="set类型">
  set类型
  <a class="anchor" href="#set%e7%b1%bb%e5%9e%8b">#</a>
</h4>
<ul>
<li>⽆序集合</li>
<li>元素为string类型</li>
<li><font color='blue'>元素具有唯⼀性，不重复</font></li>
<li><font color='blue'>说明：对于集合没有修改操作</font></li>
</ul>
<p><img src="https://blockchaincode.oss-cn-hangzhou.aliyuncs.com/Hexo_img/202208211500936.png" alt="" /></p>
<h5 id="增加-1">
  <strong>增加</strong>
  <a class="anchor" href="#%e5%a2%9e%e5%8a%a0-1">#</a>
</h5>
<p><font color='red'>添加元素</font></p>
<pre tabindex="0"><code>sadd key member1 member2 ...
</code></pre><p>例1：向键&rsquo;a3&rsquo;的集合中添加元素&rsquo;zhangsan&rsquo;、&rsquo;lisi&rsquo;、&lsquo;wangwu&rsquo;</p>
<pre tabindex="0"><code>sadd a3 zhangsan sili wangwu
</code></pre><h5 id="获取-3">
  <strong>获取</strong>
  <a class="anchor" href="#%e8%8e%b7%e5%8f%96-3">#</a>
</h5>
<p><font color='red'>返回所有的元素</font></p>
<pre tabindex="0"><code>smembers key
</code></pre><p>例2：获取键&rsquo;a3&rsquo;的集合中所有元素</p>
<pre tabindex="0"><code>smembers a3
</code></pre><h5 id="删除-3">
  <strong>删除</strong>
  <a class="anchor" href="#%e5%88%a0%e9%99%a4-3">#</a>
</h5>
<p><font color='red'>删除指定元素</font></p>
<pre tabindex="0"><code>srem key value
</code></pre><p>例3：删除键&rsquo;a3&rsquo;的集合中元素&rsquo;wangwu&rsquo;</p>
<pre tabindex="0"><code>srem a3 wangwu
</code></pre><h4 id="zset类型">
  zset类型
  <a class="anchor" href="#zset%e7%b1%bb%e5%9e%8b">#</a>
</h4>
<ul>
<li>sorted set，有序集合</li>
<li>元素为string类型</li>
<li><font color='blue'>元素具有唯⼀性，不重复</font></li>
<li><font color='blue'>每个元素都会关联⼀个double类型的score，表示权重，通过权重将元素从⼩到⼤排序</font></li>
<li><font color='blue'>说明：没有修改操作</font></li>
</ul>
<p><img src="https://blockchaincode.oss-cn-hangzhou.aliyuncs.com/Hexo_img/202208211505752.png" alt="" /></p>
<h5 id="增加-2">
  <strong>增加</strong>
  <a class="anchor" href="#%e5%a2%9e%e5%8a%a0-2">#</a>
</h5>
<p><font color='red'>添加</font></p>
<pre tabindex="0"><code>zadd key score1 member1 score2 member2 ...
</code></pre><p>例1：向键&rsquo;a4&rsquo;的集合中添加元素&rsquo;lisi&rsquo;、&lsquo;wangwu&rsquo;、&lsquo;zhaoliu&rsquo;、&lsquo;zhangsan&rsquo;，权重分别为4、5、6、3</p>
<pre tabindex="0"><code>zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
</code></pre><h5 id="获取-4">
  <strong>获取</strong>
  <a class="anchor" href="#%e8%8e%b7%e5%8f%96-4">#</a>
</h5>
<blockquote>
<p>·    返回指定范围内的元素</p>
<p>·    start、stop为元素的下标索引</p>
<p>·    索引从左侧开始，第⼀个元素为0</p>
<p>·    索引可以是负数，表示从尾部开始计数，如-1表示最后⼀个元素</p>
</blockquote>
<pre tabindex="0"><code>zrange key start stop
</code></pre><p>例2：获取键&rsquo;a4&rsquo;的集合中所有元素</p>
<pre tabindex="0"><code>zrange a4 0 -1
</code></pre><p><font color='red'>返回score值在min和max之间的成员</font></p>
<pre tabindex="0"><code>zrangebyscore key min max
</code></pre><p>例3：获取键&rsquo;a4&rsquo;的集合中权限值在5和6之间的成员</p>
<pre tabindex="0"><code>zrangebyscore aa1 5 6
</code></pre><pre tabindex="0"><code>输出：
a5 a6    //包含5，6
</code></pre><p><font color='red'>返回成员member的score值</font></p>
<pre tabindex="0"><code>zscore key member
</code></pre><p>例4：获取键&rsquo;a4&rsquo;的集合中元素&rsquo;zhangsan&rsquo;的权重</p>
<pre tabindex="0"><code>zscore aa1 a2
</code></pre><pre tabindex="0"><code>2
</code></pre><p><strong>删除</strong></p>
<p><font color='red'>删除指定元素</font></p>
<pre tabindex="0"><code>zrem key member1 member2 ...
</code></pre><p>例5：删除集合&rsquo;a4&rsquo;中元素&rsquo;zhangsan&rsquo;</p>
<pre tabindex="0"><code>zrem a4 zhangsan
</code></pre><p><font color='red'>删除权重在指定范围的元素</font></p>
<pre tabindex="0"><code>zremrangebyscore key min max
</code></pre><p>例6：删除集合&rsquo;a4&rsquo;中权限在5、6之间的元素</p>
<pre tabindex="0"><code>zremrangebyscore a4 5 6
</code></pre><h3 id="go语言交互">
  go语言交互
  <a class="anchor" href="#go%e8%af%ad%e8%a8%80%e4%ba%a4%e4%ba%92">#</a>
</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#f92672">import</span> (
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;fmt&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;github.com/gomodule/redigo/redis&#34;</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">main</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">conn</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">redis</span>.<span style="color:#a6e22e">Dial</span>(<span style="color:#e6db74">&#34;tcp&#34;</span>, <span style="color:#e6db74">&#34;:6379&#34;</span>) <span style="color:#75715e">//连接数据库，第一个参数是连接方式，一般是tcp，第二是地址，本机
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#66d9ef">defer</span> <span style="color:#a6e22e">conn</span>.<span style="color:#a6e22e">Close</span>()
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">conn</span>.<span style="color:#a6e22e">Send</span>(<span style="color:#e6db74">&#34;set&#34;</span>, <span style="color:#e6db74">&#34;aaa&#34;</span>, <span style="color:#e6db74">&#34;ccc&#34;</span>) <span style="color:#75715e">//执行操作，第一个是命令，第二个是参数，把命令发送到缓冲区，没有执行
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#a6e22e">conn</span>.<span style="color:#a6e22e">Flush</span>()                   <span style="color:#75715e">//执行缓冲区命令
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#a6e22e">rel</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">conn</span>.<span style="color:#a6e22e">Receive</span>()     <span style="color:#75715e">//接收数据库返回值
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">err</span>)
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">rel</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="操作方法">
  操作方法
  <a class="anchor" href="#%e6%93%8d%e4%bd%9c%e6%96%b9%e6%b3%95">#</a>
</h4>
<p><a href="https://godoc.org/github.com/gomodule/redigo/redis">Go操作redis文档</a></p>
<h5 id="连接数据库">
  <strong>连接数据库</strong>
  <a class="anchor" href="#%e8%bf%9e%e6%8e%a5%e6%95%b0%e6%8d%ae%e5%ba%93">#</a>
</h5>
<pre tabindex="0"><code>Dial(network, address string)（conn,err）
</code></pre><h5 id="执行数据库操作命令">
  <strong>执行数据库操作命令</strong>
  <a class="anchor" href="#%e6%89%a7%e8%a1%8c%e6%95%b0%e6%8d%ae%e5%ba%93%e6%93%8d%e4%bd%9c%e5%91%bd%e4%bb%a4">#</a>
</h5>
<pre tabindex="0"><code>Send(commandName string, args ...interface{}) error
Flush() error
Receive() (reply interface{}, err error)
</code></pre><p>Send函数发出指令，flush将连接的输出缓冲区刷新到服务器，Receive接收服务器返回的数据</p>
<p><font color='red'><strong>send将所有命令发送到缓冲区，都会执行，但是Receive接收第一条命令的返回值</strong></font></p>
<p>例如：</p>
<pre tabindex="0"><code>c.Send(&#34;SET&#34;, &#34;foo&#34;, &#34;bar&#34;)
c.Send(&#34;GET&#34;, &#34;foo&#34;)
c.Flush()//把缓冲区命令发到服务器
c.Receive() // 接收set请求返回的数据
v, err = c.Receive() // 接收get请求传输的数据
</code></pre><h5 id="do">
  Do
  <a class="anchor" href="#do">#</a>
</h5>
<pre tabindex="0"><code>Do(commandName string, args ...interface{}) (reply interface{}, err error)
//不用经过缓冲区直接执行
</code></pre><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">main</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">conn</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">redis</span>.<span style="color:#a6e22e">Dial</span>(<span style="color:#e6db74">&#34;tcp&#34;</span>, <span style="color:#e6db74">&#34;:6379&#34;</span>) 
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">defer</span> <span style="color:#a6e22e">conn</span>.<span style="color:#a6e22e">Close</span>()
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">rel</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">conn</span>.<span style="color:#a6e22e">Do</span>(<span style="color:#e6db74">&#34;get&#34;</span>, <span style="color:#e6db74">&#34;aaa&#34;</span>) 
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">err</span>)
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">rel</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><pre tabindex="0"><code>[99 99 99]
</code></pre><h5 id="reply-helper-functions回复助手函数">
  reply helper functions（回复助手函数）
  <a class="anchor" href="#reply-helper-functions%e5%9b%9e%e5%a4%8d%e5%8a%a9%e6%89%8b%e5%87%bd%e6%95%b0">#</a>
</h5>
<p>Bool，Int，Bytes，map，String，Strings和Values函数将回复转换为特定类型的值。为了方便地包含对连接Do和Receive方法的调用，这些函数采用了类型为error的第二个参数。如果错误是非nil，则辅助函数返回错误。如果错误为nil，则该函数将回复转换为指定的类型：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">exists</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">redis</span>.<span style="color:#a6e22e">Bool</span>(<span style="color:#a6e22e">c</span>.<span style="color:#a6e22e">Do</span>(<span style="color:#e6db74">&#34;EXISTS&#34;</span>, <span style="color:#e6db74">&#34;foo&#34;</span>))
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span><span style="color:#75715e">//处理错误代码
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>}
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">reflect</span>.<span style="color:#a6e22e">TypeOf</span>(<span style="color:#a6e22e">exists</span>)<span style="color:#75715e">//打印exists类型
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">main</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">conn</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">redis</span>.<span style="color:#a6e22e">Dial</span>(<span style="color:#e6db74">&#34;tcp&#34;</span>, <span style="color:#e6db74">&#34;:6379&#34;</span>) 
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">defer</span> <span style="color:#a6e22e">conn</span>.<span style="color:#a6e22e">Close</span>()
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">rel</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">redis</span>.<span style="color:#a6e22e">String</span>(<span style="color:#a6e22e">conn</span>.<span style="color:#a6e22e">Do</span>(<span style="color:#e6db74">&#34;get&#34;</span>, <span style="color:#e6db74">&#34;aaa&#34;</span>))
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">err</span>)
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">rel</span>)
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">ccc</span>
</span></span></code></pre></div><h5 id="scan函数">
  Scan函数
  <a class="anchor" href="#scan%e5%87%bd%e6%95%b0">#</a>
</h5>
<pre tabindex="0"><code>func Scan(src [] interface {},dest ... interface {})([] interface {},error)
</code></pre><p>Scan函数从src复制到dest指向的值。</p>
<p>Dest参数的值必须是整数，浮点数，布尔值，字符串，[]byte，interface{}或这些类型的切片。Scan使用标准的strconv包将批量字符串转换为数字和布尔类型。</p>
<p><strong>示例代码</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">value1</span> <span style="color:#66d9ef">int</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">value2</span> <span style="color:#66d9ef">string</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">reply</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">redis</span>.<span style="color:#a6e22e">Values</span>(<span style="color:#a6e22e">c</span>.<span style="color:#a6e22e">Do</span>(<span style="color:#e6db74">&#34;MGET&#34;</span>, <span style="color:#e6db74">&#34;key1&#34;</span>, <span style="color:#e6db74">&#34;key2&#34;</span>))
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">//处理错误代码
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>}
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">_</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">redis</span>.<span style="color:#a6e22e">Scan</span>(<span style="color:#a6e22e">reply</span>, <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">value1</span>, <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">value2</span>); <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// 处理错误代码
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>}
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">value1</span>,<span style="color:#a6e22e">value2</span>)
</span></span></code></pre></div><h4 id="返回自定义结构体">
  返回自定义结构体
  <a class="anchor" href="#%e8%bf%94%e5%9b%9e%e8%87%aa%e5%ae%9a%e4%b9%89%e7%bb%93%e6%9e%84%e4%bd%93">#</a>
</h4>
<p>序列化(字节化)</p>
<pre tabindex="0"><code>var buffer bytes.Buffer//容器
enc :=gob.NewEncoder(&amp;buffer)//编码器
err:=enc.Encode(dest)//编码 dest是你的结构体数据
</code></pre><pre tabindex="0"><code>_，err :=redis.Do(&#34;set&#34;,&#34;types&#34;,buffer.bytes()) //存储时，放入容器
</code></pre><p>反序列化（反字节化）</p>
<pre tabindex="0"><code>rel,err:=redis.Bytes(conn.Do(&#34;get&#34;,&#34;types&#34;))
if err!=nil{
	fmt.println(&#34;获取数据错误&#34;)
}
dec := gob.NewDecoder(bytes.NewReader(rel))//解码器
dec.Decode(&amp;types)//解码 types是自定义结构体
</code></pre></article>
 
      

      <footer class="book-footer">
        
  <div class="flex flex-wrap justify-between">





</div>



  <script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script>


 
        
      </footer>

      
  
  <div class="book-comments">

</div>
  
 

      <label for="menu-control" class="hidden book-menu-overlay"></label>
    </div>

    
    <aside class="book-toc">
      <div class="book-toc-content">
        
  
<nav id="TableOfContents">
  <ul>
    <li><a href="#redis">Redis</a>
      <ul>
        <li>
          <ul>
            <li><a href="#nosql介绍">NoSQL介绍</a></li>
            <li><a href="#redis简介">Redis简介</a></li>
            <li><a href="#redis安装mac">Redis安装（Mac）</a></li>
            <li><a href="#服务器端和客户端命令">服务器端和客户端命令</a></li>
            <li><a href="#数据库的操作">数据库的操作</a></li>
            <li><a href="#go语言交互">go语言交互</a></li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</nav>


 
      </div>
    </aside>
    
  </main>

  
</body>
</html>












